package com.example.waterdispenserm2.mo.ttl.d;

import android.util.Log;

/**
 * 电磁炉通信协议工具类
 * 包含8大功能的协议定义：炒菜、煲汤、火锅、煲粥、烧水、蒸煮、武火、文火
 */
public class TTLInductionCookerProtocolUtil {

        private static final String TAG = "InductionProtocol";

        // 设备常量
        public static final String TTL_DEVICE_PATH = "/dev/ttyS1"; // 工业平板TTL接口路径
        public static final int BAUDRATE = 9600; // 波特率

        // 时序参数
        public static final int REPLY_DELAY_MS = 4; // 回复延迟
        public static final int GUIDE_CODE_DURATION_MS = 2; // 引导码时长

        // 帧结构常量
        public static final byte FRAME_HEADER = (byte) 0xAA; // 帧头
        public static final byte FRAME_TAIL = 0x55; // 帧尾
        public static final int FRAME_LENGTH = 8; // 固定帧长

        // 功能码定义 (8大功能)
        public static final byte FUNCTION_NONE = 0x00; // 无功能
        public static final byte FUNCTION_COOK = 0x01; // 炒菜
        public static final byte FUNCTION_SOUP = 0x02; // 煲汤
        public static final byte FUNCTION_HOTPOT = 0x03; // 火锅
        public static final byte FUNCTION_PORRIDGE = 0x04; // 煲粥
        public static final byte FUNCTION_BOIL = 0x05; // 烧水
        public static final byte FUNCTION_STEAM = 0x06; // 蒸煮
        public static final byte FIRE_HIGH = 0x10; // 武火
        public static final byte FIRE_LOW = 0x11; // 文火

        // 控制码定义
        public static final byte CONTROL_START = 0x20; // 启动
        public static final byte CONTROL_STOP = 0x21; // 停止
        public static final byte CONTROL_PLUS = 0x22; // 加功率
        public static final byte CONTROL_MINUS = 0x23; // 减功率
        public static final byte CONTROL_TIMER = 0x24; // 定时

        // 状态码定义
        public static final byte STATUS_DISCONNECTED = 0x30; // 未连接
        public static final byte STATUS_CONNECTED = 0x31; // 已连接
        public static final byte STATUS_RUNNING = 0x32; // 运行中
        public static final byte STATUS_STOPPED = 0x33; // 已停止

        /**
         * 生成功能控制帧
         * @param function 功能码 (FUNCTION_xxx)
         * @param power 功率 (1-10)
         * @return 完整帧数据
         */
        public static byte[] generateFunctionFrame(byte function, int power) {
            byte[] frame = new byte[FRAME_LENGTH];
            frame[0] = FRAME_HEADER; // 帧头
            frame[1] = function; // 功能码
            frame[2] = (byte) (power & 0xFF); // 功率值
            frame[3] = 0x00; // 保留位
            frame[4] = 0x00; // 保留位
            frame[5] = 0x00; // 保留位
            frame[6] = calculateChecksum(frame, 0, 6); // 校验码
            frame[7] = FRAME_TAIL; // 帧尾
            return frame;
        }

        /**
         * 生成控制指令帧
         * @param control 控制码 (CONTROL_xxx)
         * @return 完整帧数据
         */
        public static byte[] generateControlFrame(byte control) {
            byte[] frame = new byte[FRAME_LENGTH];
            frame[0] = FRAME_HEADER; // 帧头
            frame[1] = 0x00; // 无功能
            frame[2] = 0x00; // 无功率
            frame[3] = control; // 控制码
            frame[4] = 0x00; // 保留位
            frame[5] = 0x00; // 保留位
            frame[6] = calculateChecksum(frame, 0, 6); // 校验码
            frame[7] = FRAME_TAIL; // 帧尾
            return frame;
        }

        /**
         * 计算校验码 (异或校验)
         */
        private static byte calculateChecksum(byte[] data, int start, int end) {
            byte checksum = 0x00;
            for (int i = start; i < end; i++) {
                checksum ^= data[i];
            }
            return checksum;
        }

        /**
         * 验证帧合法性
         */
        public static boolean verifyFrame(byte[] frame) {
            if (frame == null || frame.length != FRAME_LENGTH) {
                Log.w(TAG, "帧长度错误");
                return false;
            }
            if (frame[0] != FRAME_HEADER || frame[7] != FRAME_TAIL) {
                Log.w(TAG, "帧头帧尾错误");
                return false;
            }
            byte checksum = calculateChecksum(frame, 0, 6);
            if (frame[6] != checksum) {
                Log.w(TAG, "校验码错误");
                return false;
            }
            return true;
        }

        /**
         * 解析功能码
         */
        public static byte parseFunctionCode(byte[] frame) {
            if (verifyFrame(frame)) {
                return frame[1];
            }
            return FUNCTION_NONE;
        }

        /**
         * 解析功率值
         */
        public static int parsePower(byte[] frame) {
            if (verifyFrame(frame)) {
                return frame[2] & 0xFF;
            }
            return 0;
        }

        /**
         * 功能码转文字描述
         */
        public static String functionToText(byte function) {
            switch (function) {
                case FUNCTION_COOK: return "炒菜";
                case FUNCTION_SOUP: return "煲汤";
                case FUNCTION_HOTPOT: return "火锅";
                case FUNCTION_PORRIDGE: return "煲粥";
                case FUNCTION_BOIL: return "烧水";
                case FUNCTION_STEAM: return "蒸煮";
                case FIRE_HIGH: return "武火";
                case FIRE_LOW: return "文火";
                default: return "无";
            }
        }

        /**
         * 字节数组转16进制字符串
         */
        public static String bytesToHex(byte[] bytes) {
            if (bytes == null) return "";
            StringBuilder sb = new StringBuilder();
            for (byte b : bytes) {
                sb.append(String.format("%02X ", b));
            }
            return sb.toString().trim();
        }
    }





